package com.dys.testinternalclass;

/**
 * @className: com.dys.testinternalclass.OuterClass
 * @description: 类的组成：属性、方法、代码块(普通块、构造块、静态块、同步块)、构造器、内部类(成员,局部(位置:方法、块、构造器))
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/07/21 下午11:07
 */
public class OuterClass {
    // 属性
    int age;
    static String name;

    // 成员内部类
    public /*final abstract*/ class D {
        String name;

        public void b() {
            // 访问外部类的属性
            System.out.println(age);
            a();
        }
    }

    // 静态成员内部类
    static class E {
        public void inA() {
            System.out.println(name);
            staticA();
        }
    }

    // 构造器
    public OuterClass() {
    }

    public OuterClass(int age) {
        this.age = age;
        // 局部内部类：构造器内
        class C {

        }
    }

    {
        System.out.println("这是构造块...");
    }

    static {
        System.out.println("这是静态块...");
    }

    public void a() {
        System.out.println("外部类的a方法...");
        // 局部内部类: 方法内
        class A {
            int age = 99;
        }
        // 普通块
        {
            int age = 15;
            System.out.println(age);
            System.out.println(this.age);
            System.out.println(OuterClass.this.age);// 访问外部类的属性
            // 局部内部类: 块内
            class B {

            }
        }
        // 外部类访问内部类的内容，需要创内部类的对象，然后进行调用
        D d = new D();
        System.out.println(d.name);
        d.b();
    }

    public static void staticA() {
    }

    public static void b() {
    }
}

class Demo {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        // 创建外部类的对象
        OuterClass outer = new OuterClass();
        outer.a();

        // 创建内部类的对象: 静态
        OuterClass.E d = new OuterClass.E();
        // 创建非静态对象
        // OuterClass.D d = new OuterClass.D();
        OuterClass.D d2 = outer.new D();
    }
}